package com.tenthoundsqps.config;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

/**
 * 应用配置类
 * 配置系统级的组件和初始化操作
 * 
 * 主要功能：
 * 1. 启用定时任务调度
 * 2. 初始化Sentinel限流规则
 * 
 * 限流策略：
 * 1. 订单详情查询接口：限流10万QPS
 * 2. 订单列表查询接口：限流5万QPS
 */
@Configuration
@EnableScheduling
public class AppConfig {
    
    /**
     * 初始化Sentinel限流规则
     * 在Spring Bean初始化完成后执行
     * 
     * 限流规则：
     * 1. getOrderById接口：限制QPS为100000
     * 2. getOrdersByUserId接口：限制QPS为50000
     */
    @PostConstruct
    public void initFlowRules() {
        List<FlowRule> rules = new ArrayList<>();
        
        // 限制订单查询接口的QPS为100000
        // 保护数据库不被过多请求击垮
        FlowRule rule = new FlowRule();
        // 限流资源名称，与@SentinelResource注解中的value对应
        rule.setResource("getOrderById");
        // 限流规则类型：QPS限流
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // QPS阈值：100000
        rule.setCount(100000);
        rules.add(rule);
        
        // 限制订单列表查询接口的QPS为50000
        // 订单列表查询相对复杂，设置较低的限流阈值
        FlowRule rule2 = new FlowRule();
        // 限流资源名称，与@SentinelResource注解中的value对应
        rule2.setResource("getOrdersByUserId");
        // 限流规则类型：QPS限流
        rule2.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // QPS阈值：50000
        rule2.setCount(50000);
        rules.add(rule2);
        
        // 加载限流规则到Sentinel
        FlowRuleManager.loadRules(rules);
    }
}